package controller

import (
	"encoding/json"
	"fabric-go-sdk/sdk"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type InitCCForm struct {
	ChannelID   string `json:"channel_id"`
	OrgName     string `json:"org_name"`
	UserName    string `json:"user_name"`
	ChaincodeID string `json:"chaincode_id"`
	InitFcn     string `json:"init_fcn"`
}

// InitCC 初始化链码
func InitCC(c *gin.Context) {
	// 读取数据
	data, err := c.GetRawData()
	// 解析fabric身份信息
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "获取消息失败",
			"success": false,
		})
		return
	}
	form := &InitCCForm{}
	err = json.Unmarshal(data, form)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "初始化失败 err:" + err.Error(),
			"success": false,
		})
		return
	}
	// 调用
	err = sdk.App.InitCC(form.ChannelID, form.OrgName, form.UserName, form.ChaincodeID, form.InitFcn)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "初始化失败 err:" + err.Error(),
			"success": false,
		})
		return
	}
	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{
		"message": "初始成功",
		"success": true,
	})

}

type CCForm struct {
	ChannelId   string   `json:"channel_id"`
	OrgName     string   `json:"org_name"`
	UserName    string   `json:"user_name"`
	ChaincodeId string   `json:"chaincode_id"`
	Fcn         string   `json:"fcn"`
	Args        []string `json:"args"`
}

// InvokeCC 调用链码
func InvokeCC(c *gin.Context) {
	// 读取数据
	data, err := c.GetRawData()
	// 解析fabric身份信息
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "获取消息失败",
			"success": false,
		})
		return
	}
	form := &CCForm{}
	err = json.Unmarshal(data, form)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "序列化失败 err:" + err.Error(),
			"success": false,
		})
		return
	}

	// 调用链码
	res, err := sdk.App.InvokeCC(form.ChannelId, form.OrgName, form.UserName, form.ChaincodeId, form.Fcn, form.Args)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"state":   "调用失败",
			"success": false,
			"message": gin.H{
				"错误": err.Error(),
			},
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"state":   "调用成功",
		"success": true,
		"message": gin.H{
			"Txid:":   res.TransactionID,
			"payload": string(res.Payload),
		},
	})
	return
}

// QueryCC 查询链码
func QueryCC(c *gin.Context) {
	// 读取数据
	data, err := c.GetRawData()
	// 解析fabric身份信息
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "获取消息失败",
			"success": false,
		})
		return
	}
	form := &CCForm{}
	err = json.Unmarshal(data, form)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "序列化失败 err:" + err.Error(),
			"success": false,
		})
		return
	}
	fmt.Println("===QueryCC data===", form)

	// 调用链码
	res, err := sdk.App.QueryCC(form.ChannelId, form.OrgName, form.UserName, form.ChaincodeId, form.Fcn, form.Args)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"state":   "查询失败",
			"success": false,
			"message": gin.H{
				"错误": err.Error(),
			},
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"state":   "查询成功",
		"success": true,
		"message": gin.H{
			"Txid:":   res.TransactionID,
			"payload": string(res.Payload),
		},
	})
	return
}
